home *** CD-ROM | disk | FTP | other *** search
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <title>10.5. Giving Our Script Some Guts</title>
- <link rel="stylesheet" href="gimp-help-plain.css" type="text/css" />
- <link rel="stylesheet" href="gimp-help-screen.css" type="text/css" />
- <meta name="generator" content="DocBook XSL Stylesheets V1.66.1" />
- <link rel="start" href="index.html" title="GIMP User Manual" />
- <link rel="up" href="ch02s10.html" title="10. A Script-Fu Tutorial" />
- <link rel="prev" href="ch02s10s04.html" title="10.4. Your First Script-Fu Script" />
- <link rel="next" href="ch02s10s06.html" title="10.6. Extending The Text Box Script" />
- </head>
- <body>
- <div xmlns="" class="navheader">
- <table width="100%" summary="Navigation header">
- <tr>
- <th colspan="3" align="center" id="chaptername">10. A Script-Fu Tutorial</th>
- </tr>
- <tr>
- <td width="20%" align="left"><a accesskey="p" href="ch02s10s04.html">Prev</a> </td>
- <th width="60%" align="center" id="sectionname">10.5. Giving Our Script Some Guts</th>
- <td width="20%" align="right"> <a accesskey="n" href="ch02s10s06.html">Next</a></td>
- </tr>
- </table>
- <hr />
- </div>
- <div class="sect2" lang="en" xml:lang="en">
- <div class="titlepage">
- <div>
- <div>
- <h3 class="title"><a id="id3430769"></a>10.5. Giving Our Script Some Guts</h3>
- </div>
- </div>
- </div>
- <p>
- Let us continue with our training and add some functionality to
- our script.
- </p>
- <div class="simplesect" lang="en" xml:lang="en">
- <div class="titlepage">
- <div>
- <div>
- <h4 class="title"><a id="id3430782"></a>Creating A New Image</h4>
- </div>
- </div>
- </div>
- <p>
- In the previous lesson, we created an empty function and
- registered it with Gimp. In this lesson, we want to provide
- functionality to our script -- we want to create a new image,
- add the user's text to it and resize the image to fit the text
- exactly.
- </p>
- <p>
- Once you know how to set variables, define functions and
- access list members, the rest is all downhill -- all you need
- to do is familiarize yourself with the functions available in
- Gimp's procedural database and call those functions
- directly. So fire up the DB Browser and let's get cookin'!
- </p>
- <p>
- Let's begin by making a new image. We'll create a new
- variable, <tt class="varname">theImage</tt>, set to the result of calling Gimp's
- built-in function <tt class="code">gimp-image-new</tt>.
- </p>
- <p>
- As you can see from the DB Browser, the function
- <tt class="code">gimp-image-new</tt> takes three parameters -- the
- image's width, height and the type of image. Because we'll
- later resize the image to fit the text, we'll make a 10x10 RGB
- image. We'll store the image's width and sizes in some
- variables, too, as we'll refer to and manipulate them later in
- the script.
- </p>
- <pre class="programlisting">
- (define (script-fu-text-box inTest inFont inFontSize inTextColor)
- (let*
- (
- ; define our local variables
- ; create a new image:
- (theImageWidth 10)
- (theImageHeight 10)
- (theImage (car
- (gimp-image-new
- theImageWidth
- theImageHeight
- RGB
- )
- )
- )
- (theText) ;a declaration for the text
- ;we create later
- </pre>
- <p>
- Note: We used the value RGB to specify that the image is an
- RGB image. We could have also used 0, but RGB is more
- descriptive when we glance at the code.
- </p>
- <p>
- You should also notice that we took the head of the result of
- the function call. This may seem strange, because the database
- explicitly tells us that it returns only one value -- the ID
- of the newly created image. However, all Gimp functions return
- a list, even if there is only one element in the list, so we
- need to get the head of the list.
- </p>
- </div>
- <div class="simplesect" lang="en" xml:lang="en">
- <div class="titlepage">
- <div>
- <div>
- <h4 class="title"><a id="id3430861"></a>Adding A New Layer To The Image</h4>
- </div>
- </div>
- </div>
- <p>
- Now that we have an image, we need to add a layer to it. We'll
- call the <tt class="code">gimp-layer-new</tt> function to create the
- layer, passing
- in the ID of the image we just created. (From now on, instead
- of listing the complete function, we'll only list the lines
- we're adding to it. You can see the complete script here.)
- Because we've declared all of the local variables we'll use,
- we'll also close the parentheses marking the end of our
- variable declarations:
- </p>
- <pre class="programlisting">
- ;create a new layer for the image:
- (theLayer
- (car
- (gimp-layer-new
- theImage
- theImageWidth
- theImageHeight
- RGB_IMAGE
- "layer 1"
- 100
- NORMAL
- )
- )
- )
- ) ;end of our local variables
- </pre>
- <p>
- Once we have the new layer, we need to add it to the image:
- </p>
- <pre class="programlisting">
- (gimp-image-add-layer theImage theLayer 0)
- </pre>
- <p>
- Now, just for fun, let's see the fruits of our labors up until
- this point, and add this line to show the new, empty image:
- </p>
- <pre class="programlisting">
- (gimp-display-new theImage)
- </pre>
- <p>
- Save your work, select
- <span class="guimenu">Xtns</span>-><span class="guisubmenu">Script-Fu</span>-><span class="guimenuitem">Refresh</span>,
- run the script and a new image should pop up. It will probably
- contain garbage (random colors), because we haven't erased
- it. We'll get to that in a second.
- </p>
- </div>
- <div class="simplesect" lang="en" xml:lang="en">
- <div class="titlepage">
- <div>
- <div>
- <h4 class="title"><a id="id3430948"></a>Adding The Text</h4>
- </div>
- </div>
- </div>
- <p>
- Go ahead and remove the line to display the image (or comment
- it out with a ; as the first character of the line).
- </p>
- <p>
- Before we add text to the image, we need to set the background
- and foreground colors so that the text appears in the color
- the user specified. We'll use the
- gimp-palette-set-back/foreground functions:
- </p>
- <pre class="programlisting">
- (gimp-palette-set-background '(255 255 255) )
- (gimp-palette-set-foreground inTextColor)
- </pre>
- <p>
- With the colors properly set, let's now clean out the garbage
- currently in the image. We'll select everything in the image,
- and call clear:
- </p>
- <pre class="programlisting">
- (gimp-selection-all theImage)
- (gimp-edit-clear theImage theLayer)
- (gimp-selection-none theImage)
- </pre>
- <p>
- With the image cleared, we're ready to add some text:
- </p>
- <pre class="programlisting">
- (set! theText
- (car
- (gimp-text
- theImage
- theLayer
- 0 0
- inText
- 0
- TRUE
- inFontSize
- PIXELS
- "*" "*" "*"
- )
- )
- )
- </pre>
- <p>
- Although a long function call, it's fairly straightforward if
- you go over the parameters while looking at the function's
- entry in the DB Browser. Basically, we're creating a new text
- layer and assigning it to the variable
- <tt class="varname">theText</tt>.
- </p>
- <p>
- Now that we have the text, we can grab its width and height
- and resize the image and the image's layer to the text's size:
- </p>
- <pre class="programlisting">
- (set! theImageWidth (car (gimp-drawable-width theText) ) )
- (set! theImageHeight (car (gimp-drawable-height theText) ) )
-
- (gimp-image-resize theImage theImageWidth theImageHeight 0 0)
-
- (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
- </pre>
- <p>
- If you're like me, you're probably wondering what a drawable
- is when compared to a layer. The difference between the two is
- that a drawable is anything that can be drawn into, including
- layers but also channels, layer masks, the selection, etc; a
- layer is
- a more specific version of a drawable. In most cases, the
- distinction is not important.
- </p>
- <p>
- With the image ready to go, we can now re-add our display line:
- </p>
- <pre class="programlisting">
- (gimp-display-new theImage)
- </pre>
- <p>
- Save your work, refresh the database and give your first
- script a run!
- </p>
- </div>
- <div class="simplesect" lang="en" xml:lang="en">
- <div class="titlepage">
- <div>
- <div>
- <h4 class="title"><a id="id3431055"></a>Clearing The Dirty Flag</h4>
- </div>
- </div>
- </div>
- <p>
- If you try to close the image created without first saving the
- file, Gimp will ask you if you want to save your work before
- you close the image. It asks this because the image is marked
- as dirty, or unsaved. In the case of our script, this is a
- nuisance for the times when we simply give it a test run and
- don't add or change anything in the resulting image -- that
- is, our work is easily reproducible in such a simple script,
- so it makes sense to get rid of this dirty flag.
- </p>
- <p>
- To do this, we can clear the dirty flag after displaying the
- image:
- </p>
- <pre class="programlisting">
- (gimp-image-clean-all theImage)
- </pre>
- <p>
- This will set dirty count to 0, making it appear to be a
- "clean" image.
- </p>
- <p>
- Whether to add this line or not is a matter of personal
- taste. I use it in scripts that produce new images, where the
- results are trivial, as in this case. If your script is very
- complicated, or if it works on an existing image, you will
- probably not want to use this function.
- </p>
- </div>
- </div>
- <div class="navfooter">
- <hr />
- <table width="100%" summary="Navigation footer">
- <tr>
- <td width="40%" align="left"><a accesskey="p" href="ch02s10s04.html">Prev</a> </td>
- <td width="20%" align="center">
- <a accesskey="u" href="ch02s10.html">Up</a>
- </td>
- <td width="40%" align="right"> <a accesskey="n" href="ch02s10s06.html">Next</a></td>
- </tr>
- <tr>
- <td width="40%" align="left" valign="top">10.4. Your First Script-Fu Script </td>
- <td width="20%" align="center">
- <a accesskey="h" href="index.html">Home</a>
- </td>
- <td width="40%" align="right" valign="top"> 10.6. Extending The Text Box Script</td>
- </tr>
- </table>
- </div>
- </body>
- </html>
-